package pe.com.casadesign.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import pe.com.casadesign.dao.CorreoModuloDAO;
import pe.com.casadesign.domain.Bulto;
import pe.com.casadesign.domain.CorreoModulo;
import pe.com.casadesign.domain.LineaSolicitud;
import pe.com.casadesign.domain.LineaSolicitudBulto;
import pe.com.casadesign.domain.ListaCorreoModulo;
import pe.com.casadesign.domain.ListaLineaSolicitud;
import pe.com.casadesign.domain.ListaLineaSolicitudBulto;
import pe.com.casadesign.domain.Modulo;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.domain.Solicitud;
import pe.com.casadesign.domain.Tienda;
import pe.com.casadesign.domain.Usuario;


/**
 * Implementacion de CorreoModuloDAO.
 * 
 * @author Gustavo Susano
 * 
 */
@Repository
public class CorreoModuloDAOImpl implements CorreoModuloDAO{
private static final Logger logger = LoggerFactory.getLogger(CorreoModuloDAOImpl.class);
	
	// Nombre Procedimientos Almacenados
    private static String SP_LISTAR_CORREOMODULO = "SP_LISTAR_CORREOMODULO";
	private static String SP_OBTENER_CORREOMODULO = "SP_OBTENER_CORREOMODULO";
	
	// Parametros de Entrada
	private static String PARAM_CODCORREO = "p_codcorreo";
	private static String PARAM_CODMODULO = "p_codmodulo";
	
	// Parametros de Salida
	private static String CODCORREO = "CODCORREO";
	private static String CODMODULO = "CODMODULO";
	private static String TEXTOTITULO = "TEXTOTITULO";
	private static String TEXTOMENSAJE = "TEXTOMENSAJE"; 
	private static String TEXTOMENSAJEADICIONAL = "TEXTOMENSAJEADIC";
	private static String INDENVIARUSUARIO = "INDENVIARUSUARIO";
	private static String INDENVIARCLIENTE = "INDENVIARCLIENTE";
	private static String INDENVIARADMININSTRADOR = "INDENVIARADMIN";
	private static String ESTADO ="ESTADO";
	private static String INDENVIARUSUPRINCIPAL ="INDENVIARUSUPRINCIPAL";
	
    private static String LISTADO = "LISTADO";
	
	private static String TOTAL_FILAS_AFECTADAS = "#update-count-1";
	
	private JdbcTemplate jdbcTemplate;

	@Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
	
	@Override
	public ListaCorreoModulo listarCorreoModulo(CorreoModulo correoModulo){
		logger.info("listarCorreo");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_CORREOMODULO).
	    						  returningResultSet(LISTADO, new RowMapper<CorreoModulo>(){
									@Override
									public CorreoModulo mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final CorreoModulo correoModulo = new CorreoModulo();
								        correoModulo.setCodCorreo(rs.getInt(CODCORREO));
								        correoModulo.setEstado(rs.getString(ESTADO));
								        correoModulo.setIndEnviarAdministrador(rs.getString(INDENVIARADMININSTRADOR));
								        correoModulo.setIndEnviarCliente(rs.getString(INDENVIARCLIENTE));
								        correoModulo.setIndEnviarUsuario(rs.getString(INDENVIARUSUARIO));
								        correoModulo.setIndEnviarUsuarioPrincipal(rs.getString(INDENVIARUSUPRINCIPAL));
								        correoModulo.setTextoMensaje(rs.getString(TEXTOMENSAJE));
								        correoModulo.setTextoMensajeAdicional(rs.getString(TEXTOMENSAJEADICIONAL));
								        correoModulo.setTextoTitulo(rs.getString(TEXTOTITULO));
								        
								        Modulo modulo = new Modulo();
								        modulo.setCodigo(rs.getInt(CODMODULO));
								        correoModulo.setModulo(modulo);
								        
								        return correoModulo;
								    }
	    						  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODMODULO, correoModulo.getModulo().getCodigo()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<CorreoModulo> listaCorreoModulo = (List<CorreoModulo>)data.get(LISTADO);
        
		// Instanciando objeto ListaCorreoModulo
		ListaCorreoModulo listaCorreoModuloResultado = new ListaCorreoModulo();
        // Estableciendo resultado al objeto listaCorreoModulo
		listaCorreoModuloResultado.setLista(listaCorreoModulo);
        
        if (logger.isDebugEnabled() && listaCorreoModuloResultado != null)
        {
            logger.debug("size=" + listaCorreoModuloResultado.size());
        }
        return listaCorreoModuloResultado;
	}
	
	@Override
	public CorreoModulo obtenerCorreoModulo(CorreoModulo correoModulo) {
		logger.info("obtenerCorreoModulo");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_CORREOMODULO).
	    						  returningResultSet(LISTADO, new RowMapper<CorreoModulo>(){
									@Override
									public CorreoModulo mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
										final CorreoModulo correoModulo = new CorreoModulo();
								        correoModulo.setCodCorreo(rs.getInt(CODCORREO));
								        correoModulo.setEstado(rs.getString(ESTADO));
								        correoModulo.setIndEnviarAdministrador(rs.getString(INDENVIARADMININSTRADOR));
								        correoModulo.setIndEnviarCliente(rs.getString(INDENVIARCLIENTE));
								        correoModulo.setIndEnviarUsuario(rs.getString(INDENVIARUSUARIO));
								        correoModulo.setIndEnviarUsuarioPrincipal(rs.getString(INDENVIARUSUPRINCIPAL));
								        correoModulo.setTextoMensaje(rs.getString(TEXTOMENSAJE));
								        correoModulo.setTextoMensajeAdicional(rs.getString(TEXTOMENSAJEADICIONAL));
								        correoModulo.setTextoTitulo(rs.getString(TEXTOTITULO));
								        
								        Modulo modulo = new Modulo();
								        modulo.setCodigo(rs.getInt(CODMODULO));
								        correoModulo.setModulo(modulo);
								        
								        return correoModulo;
								    }
	    						  }
								 );

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	                                   .addValue(PARAM_CODCORREO, correoModulo.getCodCorreo());  

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
 		@SuppressWarnings("unchecked")
 		List<CorreoModulo> listaCorreoModulo = (List<CorreoModulo>)data.get(LISTADO);
         
 		// Declarando objeto CorreoModulo Obtenido
 		CorreoModulo correoModuloObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaCorreoModulo != null)
        {
            logger.debug("size=" + listaCorreoModulo.size());
        }
 		
 		if (listaCorreoModulo != null && listaCorreoModulo.size()>0){
 			// Obteniendo el primer elemento de la lista de CorreoModulo
 			correoModuloObtenido = listaCorreoModulo.get(0);
 		}
        return correoModuloObtenido;
	}

}
